/*
 * @lc app=leetcode.cn id=414 lang=cpp
 *
 * [414] 第三大的数
 */
#include "include.h"
// @lc code=start
class Solution {
public:
    int thirdMax(vector<int>& nums) {
{        set<int> s;
        for (int num : nums) {
            s.insert(num);
            if (s.size() > 3) {
                s.erase(s.begin());
            }
        }
        return s.size() == 3 ? *s.begin() : *s.rbegin();}

        // [-2147483648,1,1]
        std::set<int> largest;
        for (auto num : nums){
            largest.emplace(num);
        }
        // printf("size %zu\n", largest.size());
        if (largest.size()<3){
            auto iter = largest.end();
            iter--;
            return *iter;
        }
        else {
            auto iter = largest.end();
            iter --;
// printf("%d\n", *iter);
            iter --;
// printf("%d\n", *iter);
            iter --;
// printf("%d\n", *iter);
            return *iter;
        }

        // INT32_MIN;
        // int largestArray[3] = {INT32_MIN, INT32_MIN, INT32_MIN};
        // bool INT32_MIN_occurrence = false;
        // // printf("%d %d %d\n", largestArray[0], largestArray[1], largestArray[2]);
        // for (auto num : nums){
        //     if (num < largestArray[2]){
        //         continue;
        //     } else if (num > largestArray[2] and num < largestArray[1]){
        //         largestArray[2] = num;
        //     } else if (num > largestArray[1] and num < largestArray[0]){
        //         largestArray[2] = largestArray[1];
        //         largestArray[1] = num;
        //     } else if (num > largestArray[0]){
        //         largestArray[2] = largestArray[1];
        //         largestArray[1] = largestArray[0];
        //         largestArray[0] = num;
        //     }
        //     if (num == INT32_MIN){
        //         INT32_MIN_occurrence = true;
        //     }
        // // printf("%d %d %d\n", largestArray[0], largestArray[1], largestArray[2]);
        // }
        // if (largestArray[2] > INT32_MIN){
        //     return largestArray[2];
        // } else{
        //     if (INT32_MIN_occurrence){return largestArray[2];}
        //     else {return largestArray[0];}
        // }

{        long a = LONG_MIN, b = LONG_MIN, c = LONG_MIN;
        for (long num : nums) {
            if (num > a) {
                c = b;
                b = a;
                a = num;
            } else if (a > num && num > b) {
                c = b;
                b = num;
            } else if (b > num && num > c) {
                c = num;
            }
        }
        return c == LONG_MIN ? a : c;}

{        int *a = nullptr, *b = nullptr, *c = nullptr;
        for (int &num : nums) {
            if (a == nullptr || num > *a) {
                c = b;
                b = a;
                a = &num;
            } else if (*a > num && (b == nullptr || num > *b)) {
                c = b;
                b = &num;
            } else if (b != nullptr && *b > num && (c == nullptr || num > *c)) {
                c = &num;
            }
        }
        return c == nullptr ? *a : *c;}

    }
};
// @lc code=end

